# 列表练习

# 冒泡排序，对nums使用冒泡排序
def bubble_sort(nums):
    nums_length = len(nums)
    # 使用冒泡排序
    # 第一层循环是需要循环的次数
    for loop_time in range(nums_length - 1):
        # 第二层循环是需要比较的次数
        for index in range(nums_length - 1 - loop_time):
            if nums[index] > nums[index + 1]:
                temp = nums[index]
                nums[index] = nums[index + 1]
                nums[index + 1] = temp


# 1、找出列表当中的第二大的值
def find_second_max_num(nums):
    # 如果列表的长度小于等于1，没有第二大的值
    nums_length = len(nums)
    if nums_length < 2:
        return None
    bubble_sort(nums)
    # 返回第2大的数
    return nums[nums_length - 2]


# 2、判断一个列表是否是另一个列表的子列表
def is_sub_list(nums, sub_list):
    flag = True
    for sub_num in sub_list:
        # 只要找到一个元素不在列表中
        # 设置为False，并跳出循环
        if sub_num not in nums:
            flag = False
            break
    return flag


# 3、找出列表中，与列表最大值和最小值的平均值最接近的值
def find_first_max_min_average_num(nums):
    # 如果列表的长度小于等于1，没有第二大的值
    nums_length = len(nums)
    if nums_length == 0:
        return None
    if nums_length == 1:
        return nums[0]
    # 进行冒泡排序
    bubble_sort(nums)
    # 最大值和最小值的平均值
    average_num = (nums[0] + nums[-1]) / 2
    # 找到列表中最接近这个数据的值
    subtrate_average_list = []
    # 所有的数都减去平均值
    for index in range(nums_length):
        subtrate_average_list.append(abs(nums[index] - average_num))
    print(f'nums:{nums},'
          f'average_num:{average_num},'
          f'subtrate_average_list:{subtrate_average_list}')
    # 找到绝对值最小的那个值
    target_index = 0
    difference = subtrate_average_list[0]
    for index in range(nums_length - 1):
        if subtrate_average_list[index] < difference:
            target_index = index
            difference = subtrate_average_list[index]
            # 返回找到的那个值
    return nums[target_index]


# 3、找出列表中，与列表最大值和最小值的平均值最接近的值（简化版）
def find_first_max_min_average_num_simplification(nums):
    if nums is None or len(nums) == 0:
        return None
    # 找到最大值和最小值
    max_num = nums[0]
    min_num = nums[0]
    for index in range(len(nums)):
        if max_num < nums[index]:
            max_num = nums[index]
        if min_num > nums[index]:
            min_num = nums[index]
    # 求出平均值
    average_num = (max_num + min_num) / 2
    # 最近的值
    closest_num = nums[0]
    # 遍历数组，寻找最近的值
    for index in range(len(nums)):
        if abs(average_num - closest_num) > abs(average_num - nums[index]):
            closest_num = nums[index]
    return closest_num


if __name__ == '__main__':
    print(find_second_max_num([22, 2, 23, 3, 1]))
    print(is_sub_list([1, 2, 3, 4, 5, 6], [11, 2, 3]))
    print(find_first_max_min_average_num([22, 2, 23, 3, 1000, 501]))
    print(find_first_max_min_average_num_simplification([22, 2, 23, 3, 1000, 501]))
